// types.go
package Demodulation

import "sync"

const Pi = 3.141592653589793

type Complex struct {
	I, Q float32
}

type DemodulationInitParameter struct {
	Fs   int // 采样率
	Band int // 带宽
	Rb   int // 码速率 bps（QPSK 下实际符号率 = Rb/2）
}

type CostasPLL struct {
	Coef1, Coef2 float32
}

type SymbolSyncBuffer struct {
	Buff  [4]Complex // 4倍采样输入缓冲
	YBuff [3]Complex // 插值器输出历史
	W     float32
	N     float32
	NTemp float32
	U     float32 // μ
	KK    int
	PastW float32
	PastN float32
	Err1  float32
	Err2  float32
}

type BlockFilter struct {
	Coef    []float32
	Taps    int
	EvenSym bool
	Delay   []Complex
	mu      sync.Mutex
}

type DemodulationBurstData struct {
	SoftData  []Complex // 软符号（星座点）
	HardBits  []byte    // 解差分后的比特流
	Length    int
	StartTime int64
}

type DemodulationResult struct {
	Burst *DemodulationBurstData
}

// 主结构体（所有算法状态都在这里）
type DemoQPSK struct {
	rb         int
	fs         int
	sampPerSym int // 固定 4
	sliceSize  int // 8192

	blockFilter *BlockFilter
	symSyncBuf  *SymbolSyncBuffer
	loopF1      float32
	loopF2      float32

	// 三段 Costas
	pllStages    [3]CostasPLL
	currentStage int
	SampleCount  int64 // 累计处理的样点数，用于自动换段
	ncoPhase     float32
	freqIntegral float32

	// 差分解码状态
	lastSymbol int
	firstFrame bool
}
